package org.fixies.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日付ユーティリティクラス
 *
 * @author Kawasaki
 * @version $Id$
 */
public final class DateUtils {

    /**
     * 日付フォーマット
     */
    private static final String DEFAULT_DATE_FORMAT = "yyyy/MM/dd";

    /**
     * 日時フォーマット
     */
    private static final String DEFAULT_DATE_TIME_FORMAT = DEFAULT_DATE_FORMAT + ' ' + "HH:mm:ss";


    /**
     * コンストラクタ
     * 本クラスをインスタンス化することはできない。
     */
    private DateUtils() {
    }

    /**
     * yyyy/MM/dd形式の文字列をjava.util.Data型に変換する。
     *
     * @param date - yyyy/MM/dd形式の文字列
     * @return - 変換後のDateインスタンス
     * @throws IllegalArgumentException - 引数の形式が不正である場合
     */
    public static Date convertToDate(String date) throws IllegalArgumentException {

        return convert(date, DEFAULT_DATE_FORMAT);

    }

    /**
     * yyyy/MM/dd　hh:mm:ssの文字列をjava.util.Data型に変換する。
     *
     * @param date yyyy/MM/dd形式の文字列
     * @param time hh:mm:ssの文字列
     * @return - 変換後のDateインスタンス
     * @throws IllegalArgumentException - 引数の形式が不正である場合
     */
    public static Date convertToDate(String date, String time) {
        if (date == null || date.length() == 0) {
            return null;
        }
        if (time == null || time.length() == 0) {
            time = "00:00:00";
        }

        String dateTime = date + ' ' + time;
        Date converted = convert(dateTime, DEFAULT_DATE_TIME_FORMAT);
        return converted;

    }

    /**
     * 文字列からjava.util.Data型に変換する。
     *
     * @param str     文字列
     * @param pattern SimpleDateFormatに適用可能なパターン
     * @return 変換後のDateインスタンス
     */
    private static Date convert(String str, String pattern) {
        if ((str == null) || (str.length() == 0)) {
            return null;
        }

        SimpleDateFormat df = new SimpleDateFormat();
        df.applyPattern(pattern);
        Date converted;
        try {
            converted = df.parse(str);
        } catch (ParseException e) {
            throw new IllegalArgumentException("引数は" + pattern + "形式でなければいけません。["
                    + str + "]");
        }
        return converted;
    }

    /**
     * java.util.Dataをyyyy/MM/dd形式の文字列に変換する。
     *
     * @param date 変換対象となるDateインスタンス
     * @return 変換後文字列
     */
    public static String formatDate(Date date) {
        if (date == null) {
            return "";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
        String str = sdf.format(date);
        return str;
    }

}
